package com.zhanghp.common;

import java.util.Arrays;
import java.util.function.Consumer;

/**
 * @author zhanghp
 * @since 2024/3/5 11:03
 */
public class ArrUtil {

    /**
     * 生成随机数组
     *
     * @param maxLength 数组最大长度 [1, maxLength]
     * @param maxValue  数组最大峰值 [1, maxValue]
     * @return
     */
    public static int[] rand(int maxLength, int maxValue) {
        int size = (int) (Math.random() * maxLength) + 1;
        int[] arr = new int[size];

        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * maxValue) + 1;
        }
        return arr;
    }

    /**
     * 对数器
     *
     * @param testTime  测试次数
     * @param maxLength 数组最大长度 [1, maxLength]
     * @param maxValue  数组最大峰值 [1, maxValue]
     * @param consumer  自定义校验逻辑
     */
    public static void validator(final int testTime, final int maxLength, final int maxValue, Consumer<int[]> consumer) {
        System.out.println("测试开始");
        for (int i = 0; i < testTime; i++) {
            int[] rand = rand(maxLength, maxValue);
            consumer.accept(rand);
        }
        System.out.println("测试结束");
    }

    /**
     * 交换
     *
     * @param arr  数组
     * @param var1 索引1
     * @param var2 索引2
     */
    public static void swap(int[] arr, int var1, int var2) {
        int temp = arr[var1];
        arr[var1] = arr[var2];
        arr[var2] = temp;
    }

    /**
     * 打印数组
     *
     * @param arr 数组
     */
    public static void print(int[] arr){
        System.out.println(Arrays.toString(arr));
    }

    public static int[] copy(int[] arr){
        int[] copy = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            copy[i] = arr[i];
        }
        return copy;
    }

    /**
     * 数组是否为有序：小 -> 大
     *
     * @param arr 数组
     * @return <ul></li><li>true: 有序</li><li>false：无序</li></ul>
     */
    public static boolean isSorted(int[] arr){
        if(arr.length < 2){
            return true;
        }
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            // 低位比高位大，则返回false
            if (max > arr[i]) {
                return false;
            }
            max = arr[i];
        }
        return true;
    }
}
